package com.ivo.activiti.dao;

import java.io.Serializable;
import java.util.List;

/**
 * DAO封装
 * @author wj
 * @version 1.0
 */
public  interface Dao {

    /**
     * 按ID获取对象
     * @param clazz T
     * @param id ID
     * @param <T> 泛型
     * @return T
     */
    <T> T getObject(Class<T> clazz, Serializable id);

    /**
     * 按属性查找唯一对象
     * @param clazz T
     * @param propertyName 属性
     * @param value 属性值
     * @param <T> 泛型
     * @return T
     */
    <T> T getObject(Class<T> clazz, String propertyName, Object value);

    /**
     * 保存或更新
     * @param o Entity对象
     */
    void saveOrUpdateObject(Object o);

    /**
     * 按属性查找对象列表,匹配方式为相等.
     * @param clazz T
     * @param propertyName 属性
     * @param value 属性值
     * @param <T> 泛型
     * @return List<T>
     */
    <T> List<T> find(Class<T> clazz, String propertyName, Object value);

    /**
     * 按属性查找对象列表,匹配方式为相等.
     * @param clazz T
     * @param propertyNames 属性集合
     * @param values 属性值集合
     * @param <T> T 泛型
     * @return List<T>
     */
    <T> List<T> find(Class<T> clazz, String[] propertyNames, Object[] values);

    /**
     * 查询所有的对象
     * @param clazz T
     * @param <T> T 泛型
     * @return List<T>
     */
    <T> List<T> findAll(Class<T> clazz);

    /**
     * 简单sql查询
     * @param sql
     * @return List
     */
    List findBySql(String sql);

    <T> List<T> find(String hql, Class<T> clazz, Object... params);
}
